package 创建者模式.singleton.懒汉式_双重检查锁;

/**
 * @Description 双重检查锁
 * 解决了单例，性能，安全问题
 * 问题：多线程情况下会产生空指针问题
 * 原因：jvm在实例化对象时会进行优化和指令重排序操作
 * 解决：使用volatile关键字
 * @Author shallow
 * @Date 2023/3/1 14:15
 */

public class Singleton {
    /*
        if(instance == null){
        //写操作
            instance = new Singleton();
        }
        //读操作
        return instance;
    }
    大部分情况为写操作，如果使用synchronized性能较差
     */
    //私有构造方法
    private Singleton (){}
    //声明Singleton类型的变量
    private static volatile Singleton instance;
    //对外提供公共的访问方式
    public static Singleton getInstance(){
        //第一次判断,如果instance的值不为null，不需要抢占锁，直接返回对象
        if(instance == null){
            synchronized (Singleton.class){
                //第二次判断
                if(instance == null){
                    instance = new Singleton();
                }
            }
        }
        //读操作直接返回
        return instance;
    }
}
